<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }
        ul{
            background-color: gray;
            padding: 20px 0;
        }
        li {
            height: 40px;
            line-height: 40px;
            border: 1px dashed #000;
            margin-top: 10px;
            background-color: pink;
        }
        p{
            height: 40px;
            line-height: 40px;
            border: 1px dashed #000;
            margin-top: 10px;
            background-color: #6ff;
        }
    </style>
</head>

<body>
    <div class="wrap">
        <div>
            <button class="addEle">新增</button>
        </div>
        <ul class="list">
            <p>p_01</p>
            <li class="first">01</li>
            <li>02</li>
            <p>p_02</p>
            <li class="mid">03</li>
            <li>04</li>
            <li>05</li>
            <li class="last">06</li>
            <p>p_03</p>
        </ul>
    </div>
</body>
<script>
    
    // 需求: 给.list中的li绑定点击事件  => 打印当前元素和下标
    
    // 传统的多元素绑定事件   
    // 用法: 遍历集合中的每一个元素,循环绑定事件
    // 缺点： 
    // 1. n个元素绑定n个事件 => 赋值n个函数,占内存 
    // 2. 只能给页面加载时已经获取的元素绑定事件 => 无法给未来生成的元素绑定事件(页面加载时没有,后面又生成的元素)


    // 事件委托: (前提:同种类型的事件)
    // 用法: 利用事件冒泡的元素,将子元素的事件委托给父元素,由父元素代为执行

    // 事件委托的实现步骤:
    // (1) 给父元素绑定相同类型的事件
    // (2) 事件触发时,查找触发事件的元素(事件源 => 谁触发的?)
    // (3) 判断触发事件的元素(事件源) 是否是委托事件的子元素
    //   3.1  如果元素类型不同 => 通过标签名区分
    //   3.2  

    // 事件委托的优点
    // 1. 子元素将事件委托给父元素, 父元素只需绑定一次 => 节省内存
    // 2. 可以给未来生成的元素绑定事件(未来生成的元素 => 页面加载时没有,后续又生成的)
    // 3. 提高了代码的执行速度, 代码更简洁



    var ul = document.querySelector(".list");
    var addEle = document.querySelector(".addEle");
    var liList = ul.getElementsByTagName("li");  // 元素的集合(HTMLCollection 可以随页面同类型元素增加,自动更新集合)


    ul.onclick = function(e){
        var target = e.target;

        // tagName  元素节点的内置属性(返回元素的标签名(字符串) => 大写)
        // console.log("ul被点击了",target, target.tagName);

        if(target.tagName.toLowerCase() == "li"){
            var index = Array.from(liList).indexOf(target);
            console.log("点击了li", target,index);
        }
    }


    // 点击新增按钮 => 新增一个li, 放到.list中所有元素的最后方
    addEle.onclick = function () {
        var ele = document.createElement("li"); // 创建元素节点 li => 赋值给变量ele
        console.log(ele);

        // 被创建的元素节点就是一个正常的元素
        ele.setAttribute("class", "newLi"); //新增属性
        ele.innerText = "我是新增的li"; // 设置文本
        ele.style.background = "red"; // 设置样式
        // ele.onclick = function () {  // 绑的事件
        //     console.log("我被点击了");
        // }

        ul.appendChild(ele); // 追加节点
        console.log(liList);
    }




</script>

</html>